一个对象的私有数据只能通过成员函数进行访问,这是一堵不透明的墙。这种限制性给这样的一种情况造成困扰:类的某些成员原则上应该是私有的,但却需要在外部频繁地访问它们。常用的做法是为类设计一个返回这些成员引用的获取函数get(),这无疑带来了额外的开销。因此,仅仅出于效率(而非技术上必须)的考虑,C++提供了一种辅助手段中,允许类外面的类或函数去访问一个类的私有数据,这就是友元(friend)机制。

一个类的友元可以是一个外部函数,也可以是一个类。它们虽然不是该类的成员,但却能直接访问该类的任何成员,这显然提高了访问效率,但带来的问题是,这在一定程序上违背了数据封装原则。

class ca
{
    friend funa();
    friend cb::mfun();
    friend class cc;
};

友元机制允许一个类将对其非公有成员的访问权授予指定的函数或类。友元的声明以关键字 friend 开始。它只能出现在类定义的内部。友元声明可以出现在类中的任何地方:友元不是授予友元关系的那个类的成员,所以它们不受声明出现部分的访问控制影响。

友元可以是友元类,可以是友元函数,也就是独立于类的全局函数,如果该全局函数被某个类声明为友元,该全局函数就被授予了访问该类私有成员和保护成员的资格。

操作符定义为非成员函数时,通常必须将它们设置为所操作类的友元。

所谓有元类就是两个有缘的类。其中一个类A将另一个类B声明为友元,则类B的成员函数能够访问A的所有成员,无论这些成员是公有的还是私有的。友元其实是对于访问控制的一种有限突破。想私有,但想让特定(朋友)的类能够访问。

声明友元的方法为:

class A
{
    friend class B;
    ……
}

将整个类设置为友元,极大地破坏了类的封装性。在C++中,还可以单独地将某个函数或某个类的某个成员函数声明为友元:

class A
{
    friend 返回值类型 函数名()参数表;  //友元函数
    friend 返回值类型 B::成员函数名()参数表;  //友元成员函数
}

友元是对类的访问控制或封装性的一种突破或破坏。可以是友元类,可以是友元函数,可以是友元成员函数;

友元的作用是什么?

使全局函数或其他类的成员函数、甚至是某个类定义所有的成员函数可以直接访问当前类的私有成员。

类的私有成员只能通过它的成员函数来访问。

友元函数是一扇通往私有成员的后门。

友元可以是一个一般函数(友元函数),也可以是另一个类的成员函数(友元成员),还可以是整个类(友元类)。

2

对于类的私有方法,只有在该类中允许访问,其他类是不能访问的。但在开发程序时,如果两个类的耦合度比较紧密,能够在一个类中访问另一个类的私有成员会带来很大的方便。C++语言提供了友元类和友元方法(或者称为友元函数)来实现访问其他类的私有成员。当用户希望另一个类能够访问当前类的私有成员时,可以在当前类中将另一个类作为自己的友元类,这样,在另一个类中就可以访问当前类的私有成员了。

对于友元函数来说,不仅可以是类的成员函数,还可以是一个全局函数。

友元是一种破坏类的封装性获取类的隐藏数据的方式。

友元函数近似于普通的函数,它不带有this指针,因此必须将对象名或对象的引用作为友元函数的参数,这样才能访问到对象的成员。

大多数情况是友元函数是某个类的成员函数,即A类中的某个成员函数是B类中的友元函数,这个成员函数可以直接访问B类中的私有数据。这就实现了类与类之间的沟通。

成员函数与友元函数,友元可以访问类的私有数据,但需增加类对象的入参,而成员函数隐含了一个this指针参数。this指针指向类对象,因为成员函数是在对象建立后才可以调用的。所以静态成员函数不隐含this指针,因为其不依赖于对象调用,可以是类对象调用。